boto3 waitersのポーリング条件を変更する
AWSのAWS CLI/golang/python/rubyなどのSDKにはWaitersという機能が存在し、APIを実行後、指定した状態になるためポーリングする機能があります。
今回はPython SDK boto3のポーリング条件を変更する方法を紹介します。
- より短い間隔でポーリングしたい
- 処理が重いため、ポーリング数/間隔を増やさないと、ポーリング上限を超えて
WaiterError
エラーが発生する
というようなケースで有用かと思います。
Waiters の基本的な使い方
たとえば、Kinesisストリームを作成後、ストリームが ACTIVE
になるまでポーリングする場合、次のようにします。
import boto3 client = boto3.client('kinesis') NAME='Foo' # Create Kinesis Stream client.create_stream( StreamName=NAME, ShardCount=1 ) # Poll with Waiters waiter.wait(StreamName=NAME)
ストリームがACTIVEになるまで waiter.wait
はブロッキング状態になります。
Waiters 条件のカスタマイズ
Waiters オブジェクトを覗いてみましょう
$ ipython In [1]: import boto3 In [2]: client = boto3.client('kinesis') In [3]: waiter = client.get_waiter('stream_exists') In [4]: waiter.config.__dict__ Out[4]: {'_config': OrderedDict([(u'delay', 10), (u'operation', u'DescribeStream'), (u'maxAttempts', 18), (u'acceptors', [OrderedDict([(u'expected', u'ACTIVE'), (u'matcher', u'path'), (u'state', u'success'), (u'argument', u'StreamDescription.StreamStatus')])])]), 'delay': 10, 'description': '', 'max_attempts': 18, 'operation': u'DescribeStream'}
出力結果からわかるように Waiters では
- ポーリング間隔(delay)
- ポーリング回数(max_attempts)
- ステータスチェック条件(_config)
などが設定されています。これらの値は、botocore モジュールで定義されています。 Kinesis であれば、次のファイルになります。
https://github.com/boto/botocore/blob/develop/botocore/data/kinesis/2013-12-02/waiters-2.json
これらの値は動的に書き換えられるため、書き換え後に wait を実行すれば目的を達成できます。
試しに、ポーリング間隔を変更してみましょう
## ポーリング間隔の値を確認 In [7]: waiter.config.delay Out[7]: 10 ## 書き換える In [8]: waiter.config.delay=5 ## 書き換え後の値を確認 In [9]: waiter.config.delay Out[9]: 5 ## ストリームを作成 In [12]: client.create_stream( … In [13]: waiter.wait(StreamName=NAME) … 書き換え後の条件を元に Waiter が実行される
delay x max_attempts の秒数以内に期待の状態に遷移しなければ、WaiterError
エラーでポーリングを抜けます。
ポーリング間隔を変更した時は、ポーリング数も調整してください。
まとめ
今回はAWS Python SDK(boto3)でWaiter機能のポーリング間隔を変更する方法をお伝えしました。
boto3のWaiterでスクリプトを組んで WaiterError
エラーが発生した場合は、今回紹介した方法を参考にして下さい。
boto3/aws cli ともに低レイヤーをbotocoreで共有しており、内部的には botocore レイヤーで wait 条件を管理しています。 外部から環境変数などで書き換える口が用意されていないため、aws cliでは、アドホックにポーリング条件を変更できません。
aws cli でもデフォルト条件を書き換える口(環境変数、コマンドライン)が提供されると、便利になるのではないかと思います。